// Barcode.js
// 条码系统基类
// 所有具体条码类型（如 MSI, Pharmacode, Code128 等）的父类

/**
 * 条码基类
 *
 * 所有具体条码编码器应继承此类
 * 提供通用属性：data, text, options
 */
export default class Barcode {
  /**
   * 构造函数
   * @param {string} data - 编码后的原始数据（如二进制字符串 "101001..."）
   * @param {Object} options - 配置项
   */
  constructor(data, options = {}) {
    if (new.target === Barcode) {
      throw new Error('Barcode 是抽象基类，不能直接实例化');
    }

    _classCallCheck(this, Barcode);

    /**
     * 原始编码数据（由子类的 encode() 返回）
     * 通常是二进制字符串，如 "10110111..."
     * @type {string}
     */
    this.data = data;

    /**
     * 显示在条码下方的文本
     * 默认为输入数据，可由 options.text 覆盖
     * @type {string}
     */
    this.text = options.text ?? data;

    /**
     * 条码配置选项
     * 如：width, height, displayValue, font, textAlign 等
     * @type {Object}
     */
    this.options = options;
  }

  /**
   * 编码方法（抽象方法）
   * 子类必须实现此方法
   *
   * @returns {{ data: string, text: string }}
   *   - data: 二进制条码数据（'1'=bar, '0'=space）
   *   - text: 显示文本
   */
  encode() {
    throw new Error(
      `encode() 方法必须由 ${this.constructor.name} 子类实现`
    );
  }

  /**
   * 验证输入数据是否有效（抽象方法）
   * 子类应重写此方法
   *
   * @returns {boolean}
   */
  valid() {
    throw new Error(
      `valid() 方法必须由 ${this.constructor.name} 子类实现`
    );
  }

  /**
   * 获取选项值，支持默认值
   * @param {string} key
   * @param {*} defaultValue
   * @returns {*}
   */
  getOption(key, defaultValue) {
    return this.options[key] !== undefined ? this.options[key] : defaultValue;
  }

  /**
   * 获取原始输入数据
   * @returns {string}
   */
  getData() {
    return this.data;
  }

  /**
   * 获取显示文本
   * @returns {string}
   */
  getText() {
    return this.text;
  }
}

// 兼容旧版 _classCallCheck 辅助函数（可选保留）
function _classCallCheck(instance, Constructor) {
  if (!(instance instanceof Constructor)) {
    throw new TypeError("Cannot call a class as a function");
  }
}